/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CONTROLES;

import INTERFAZ.InformacionCliente;
import INTERFAZ.PantallaPrincipal;
import INTERFAZ.RegistroCliente;
import INTERFAZ.RegistroDactilarFrame;
import MODELOS.Cliente;
import MODELOS.HuellaDigital;
import UTILITARIOS.Herramienta;
import com.griaule.grfingerjava.FingerprintImage;
import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.IFingerEventListener;
import com.griaule.grfingerjava.IImageEventListener;
import com.griaule.grfingerjava.IStatusEventListener;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import java.awt.Toolkit;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author Administrador
 */
public class HabilitarHuella implements IStatusEventListener, IImageEventListener,IFingerEventListener {

     private MatchingContext huellaSDK;
     private boolean autoExtract = true;
     private ByteArrayInputStream huellasDatos;

     private RegistroDactilarFrame reg;
     
   /**Arreglo que contiene la longitud del dato de la huella*/
   private int huellaLongitud;

   /** La imagen de la última huella digital capturada. */
   private FingerprintImage huellaDigital;

   /** La plantilla de la última imagen de huella capturada */
   public com.griaule.grfingerjava.Template template;

   public HabilitarHuella(RegistroDactilarFrame reg){

    this.reg=reg;
   }
   
   public HabilitarHuella(){}

   public void inicializarCaptura() {
       try {
           huellaSDK = new MatchingContext();
           //Inicializa la captura de huella digital.
           GrFingerJava.initializeCapture(this);
       } catch (Exception e) {
           //Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
           e.printStackTrace();
           System.exit(1);
       }
   }

   public void terminarCaptura() {
       try {
          GrFingerJava.finalizeCapture();
            huellaSDK.destroy();
       } catch (Exception e) {
           //Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la aplicación.
           e.printStackTrace();
           System.exit(1);
       }
   }

    public static void setFingerprintSDKNativeDirectory(String directorio) {
       File directory = new File(directorio);

       try {
           GrFingerJava.setNativeLibrariesDirectory(directory);
           GrFingerJava.setLicenseDirectory(directory);
       } catch (GrFingerJavaException e) {
           e.printStackTrace();
       }
   }

    public void onSensorPlug(String idSensor) {
        try {
           //Comienza la captura con el lector conectado.
           GrFingerJava.startCapture(idSensor, this, this);
       } catch (GrFingerJavaException e) {
           //Indica si ha ocurrido un error con el lector.
           e.printStackTrace();
       }
    }

    public void onSensorUnplug(String idSensor) {
        try {
           GrFingerJava.stopCapture(idSensor);
       } catch (GrFingerJavaException e) {
           //Indica si ha ocurrido un error con el lector.
           e.printStackTrace();
       }
    }

    public void onImageAcquired(String arg0, FingerprintImage huellaCapturada) {

        this.huellaDigital=huellaCapturada;

       //Muestra la imagen obtenida
        
       reg.showImage(huellaDigital);
        extract();
        
       
       
        

    }

     public void extract() {

       try {
           //Extrae el template de la imagen de la huellaDigital actual.
           template = huellaSDK.extract(huellaDigital);
           //muestra minutias, segmentos y direcciones de la huella
          
           reg.showImage(GrFingerJava.getBiometricImage(template,huellaDigital));
          
           } catch (GrFingerJavaException e) {
           JOptionPane.showMessageDialog(reg, "No se capturo la huella, ingrese nuevamente su dedo", "Advertencia", JOptionPane.OK_OPTION);
           e.printStackTrace();
       }

   }

    public void onFingerDown(String idSensor) {

    }

    public void onFingerUp(String arg0) {

    }

    public void guardarHuella(String mano, String dedo, int idEmp )
    {
         huellasDatos = new ByteArrayInputStream(template.getData());
         huellaLongitud= template.getData().length;

         HuellaDigital ima = new HuellaDigital();
         ima.setIdCliente(idEmp);
         ima.setNombreMano(mano);
         ima.setNombreDedo(dedo);
         ima.setHuellaDactilar(huellasDatos);
         ima.setLongitudHuella(huellaLongitud);

         guardarDatosHuella(ima);

    }
     public void guardarDatosHuella(HuellaDigital im)
     {
         Conexion conection = new Conexion();

        try {
            Connection conectado = conection.getConexion();
            PreparedStatement ps =
              conectado.prepareStatement("INSERT INTO HUELLA(id_cliente,nombre_mano,nombre_dedo,huella_dac)VALUES "+ "(?,?,?,?)");

            ps.setInt(1,im.getIdCliente());
            ps.setString(2, im.getNombreMano());
            ps.setString(3, im.getNombreDedo());
            ps.setBinaryStream(4, im.getHuellaDactilar(), im.getLongitudHuella());
            ps.executeUpdate();
            ps.close();
    } catch (SQLException em) {
            System.out.println("error al insertar la huella "+em.getLocalizedMessage() );

    }
  }

     public int getUltimoIdHuella(){
    int idUltimo=0;
    Conexion conexion=new Conexion();

    try {
            Connection conectado = conexion.getConexion();
            PreparedStatement psU = conectado.prepareStatement("select id_huella from HUELLA order by id_huella desc limit 1"+";");
            ResultSet resUltimo = psU.executeQuery();

            while(resUltimo.next()){
            idUltimo = resUltimo.getInt(1);
                System.out.println("resUltimo = " + resUltimo);

            }
        } catch (SQLException ex) {
            System.out.println("Ocurrio un error al obtener id del usuario" +ex.getLocalizedMessage());
        }
    return idUltimo;
  }

   

}
